package com.vanysoft.common.utils.date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 类名称：DateUtil
 * 类描述：日期相关操作工具类
 * 创建人：X
 * 创建时间：2017年9月18日下午3:54:03
 * 修改人：X
 * 修改时间：2017年9月18日
 * 版本信息：@version 1.0
 * Copyright (c) 2017SharpClaw-版权所有
 * 修改备注：
 */
public class DateUtil {
    /**
     * 获得指定日期的前一天
     *
     * @param specifiedDay
     * @param format
     * @return
     * @throws Exception
     */
    public static Date getDayBefore(Date date, String format) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day - 1);

        String dayBeforeStr = new SimpleDateFormat(format).format(c.getTime());

        Date dayBefore = null;
        try {
            dayBefore = new SimpleDateFormat(format).parse(dayBeforeStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dayBefore;
    }

    /**
     * 获得指定日期的后一天
     *
     * @param specifiedDay
     * @return
     */
    public static Date getDayAfter(Date date, String format) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day + 1);
        String dayAfterStr = new SimpleDateFormat(format).format(c.getTime());
        Date dayAfter = null;
        try {
            dayAfter = new SimpleDateFormat(format).parse(dayAfterStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dayAfter;
    }

    /**
     * Function Name               loginValidate
     *
     * @param unit[D:day;W:week;M:month;Y:year]
     * @return
     * @throws VanySoftBaseException
     * @description 日期工具类增加指定单位的日期方法
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年9月19日上午11:12:26          X          Initial
     * *********************************************************************
     */
    public static Date addDay(Date date, Integer i, String unit) {
        String format = "yyyy-MM-dd";
        Date returnDate = null;
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        if ("D".equalsIgnoreCase(unit)) {
            c.add(Calendar.DAY_OF_YEAR, i);
        } else if ("M".equalsIgnoreCase(unit)) {
            c.add(Calendar.MONTH, i);
        } else if ("Y".equalsIgnoreCase(unit)) {
            c.add(Calendar.YEAR, i);
        }
        String dayAfterStr = new SimpleDateFormat(format).format(c.getTime());
        try {
            returnDate = new SimpleDateFormat(format).parse(dayAfterStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return returnDate;
    }

    /**
     * 获得指定日期的前一天
     *
     * @param specifiedDay
     * @param format
     * @return
     * @throws Exception
     */
    public static String getSpecifiedDayBefore(String specifiedDay, String format) {
        // SimpleDateFormat simpleDateFormat = new
        // SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();
        Date date = null;
        try {
            date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day - 1);

        String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
        return dayBefore;
    }

    /**
     * 获得指定日期的后一天
     *
     * @param specifiedDay
     * @return
     */
    public static String getSpecifiedDayAfter(String specifiedDay, String format) {
        Calendar c = Calendar.getInstance();
        Date date = null;
        try {
            // date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
            date = new SimpleDateFormat(format).parse(specifiedDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day + 1);

        // String dayAfter=new
        // SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
        String dayAfter = new SimpleDateFormat(format).format(c.getTime());
        return dayAfter;
    }

    /**
     * 将date类型准成指定format格式的字符串
     *
     * @param day    日期
     * @param format 指定格式
     * @return
     */
    public static String date2String(Date day, String format) {
        String dateStr = new SimpleDateFormat(format).format(day.getTime());
        return dateStr;
    }

    /**
     * 将字符串转成指定格式的date类型
     *
     * @param day    日期
     * @param format 指定格式
     * @return
     */
    public static Date string2Date(String dateStr, String format) {
        Date strDate = null;
        try {
            strDate = new SimpleDateFormat(format).parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return strDate;
    }

    /**
     * @Title: DateDate2CompareValue @Description: 两个date类型比较大小 @param dayAfter
     * date类型 @param date date类型 @param 格式化 @return boolean @throws
     */
    public static boolean DateDate2CompareValue(Date dayAfter, Date date, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            Date d1 = sdf.parse(sdf.format(dayAfter));
            Date d2 = sdf.parse(sdf.format(date));
            if (d1.getTime() >= d2.getTime()) {
                return true;
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 比较两个日期年月日的大小 @Title: DateCompareValue @Description:
     * 一个stirng一个date类型比较大小 @param date1 String类型 @param date2
     * date类型 @param @return @return boolean @throws
     */
    public static boolean DateStrDateCompareValue(String date1, Date date, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            Date d1 = sdf.parse(date1);
            Date d2 = sdf.parse(sdf.format(date));
            if (d1.getTime() >= d2.getTime()) {
                return true;
            }
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 比较两个日期年月日的大小 @Title: DateStr2CompareValue @Description:
     * 两个string类型比较时间大小 @param date1 @param date2 @return boolean @throws
     */
    @SuppressWarnings("unused")
    public static boolean DateStr2CompareValue(String date1, String date2, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            Date d1 = sdf.parse(date1);
            Date d2 = sdf.parse(date2);
            if (d1.getTime() >= d2.getTime()) {
                return true;
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return false;
    }

    /**
     * @Title: get2DateListDate @date 2016年5月17日 下午2:11:48 @Description: 获取时间之内的
     * 相隔天数的date集合 @param @param preDate 开始时间 @param @param nextDate
     * 结束时间 @param @param format fomat格式 @param @return @return List<Date>
     * 相隔天数集合 @throws
     */
    public static List<Date> get2DateListDate(String preDate, String nextDate, String format) {
        List<Date> list = new ArrayList<>();
        if (nextDate.equals(preDate)) {// 开始时间 结束时间相等就直接返回
            list.add(DateUtil.string2Date(preDate, format));
            return list;
        }
        String nexDate = DateUtil.getSpecifiedDayAfter(preDate, format);
        list.add(DateUtil.string2Date(preDate, format));
        list.add(DateUtil.string2Date(nexDate, format));
        while (!nexDate.equals(nextDate)) {
            String nextnextDate = DateUtil.getSpecifiedDayAfter(nexDate, format);
            list.add(DateUtil.string2Date(nextnextDate, format));
            nexDate = nextnextDate;
        }
        return list;
    }

    /**
     * @Title: get2DateListDate @date 2016年5月17日 下午2:11:48 @Description: 获取时间之内的
     * 相隔天数的string集合 @param @param preDate 开始时间 @param @param nextDate
     * 结束时间 @param @param format fomat格式 @param @return @return List<Date>
     * 相隔天数集合 @throws
     */
    public static List<String> get2DateListDateStr(String preDate, String nextDate, String format) {
        List<String> list = new ArrayList<>();
        if (nextDate.equals(preDate)) {// 如果开始时间等于结束时间那么就是同一天
            list.add(preDate);
            return list;
        }
        String nexDate = DateUtil.getSpecifiedDayAfter(preDate, format);
        list.add(preDate);
        list.add(nexDate);
        while (!nexDate.equals(nextDate)) {
            String nextnextDate = DateUtil.getSpecifiedDayAfter(nexDate, format);
            list.add(nextnextDate);
            nexDate = nextnextDate;
        }
        return list;
    }

    /**
     * @Title: get2DateListWithDate @date 2016年5月26日 上午9:20:29 @Description:
     * 获取两个日期之间日期的 @param @param startDate 开始日期 date类型 @param @param endDate
     * 结束日期 date类型 @param @return @return List<Date> datelist @throws
     */
    public static List<Date> get2DateListWithDate(Date startDate, Date endDate, String format) {
        List<Date> list = new ArrayList<>();
        if (startDate.getTime() > endDate.getTime()) {
            return list;
        }
        String startDateStr = DateUtil.date2String(startDate, format);
        String endDateStr = DateUtil.date2String(endDate, format);
        if (startDateStr.equals(endDateStr)) {// 如果开始时间等于结束时间那么就是同一天
            list.add(startDate);
            return list;
        }
        Date nextDate = DateUtil.getDayAfter(startDate, format);
        String nextDateStr = DateUtil.date2String(nextDate, format);
        // String endDateStr = DateUtil.date2String(endDate, format);
        list.add(startDate);
        list.add(nextDate);
        while (!nextDateStr.equals(endDateStr)) {
            String nextnextDate = DateUtil.getSpecifiedDayAfter(nextDateStr, format);
            list.add(DateUtil.string2Date(nextnextDate, format));
            nextDateStr = nextnextDate;
        }

        return list;
    }

//	public static void main(String[] args) throws Exception {
//		Date now = new Date();
//		String format = "yyyy-MM-dd";
//		Calendar c = Calendar.getInstance();
//		c.setTime(now);
//		String dayStr = new SimpleDateFormat(format).format(c.getTime());
//		System.out.println(dayStr);
//		Date yyy = addDay(now,1,"M");
//		c = Calendar.getInstance();
//		c.setTime(yyy);
//		dayStr = new SimpleDateFormat(format).format(c.getTime());
//		System.out.println(dayStr);
//		
//	}
}
